www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/de_rate_match.m

    function d = de_rate_match(e,iUE,iTB)
% 功能:解速率匹配
% 输入:
%        e:速率匹配输入符号
%      iUE:第iUE个用户
%      iTB:第iTB个传输块
% 输出:
%        d:去速率匹配得到的符号
% 
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ===========================================================

global LTE_par
cSubTC = 32;    % 交织深度
rSubTC = LTE_par.UE_par.rSubTC(iTB,iUE);    % 交织矩阵行数
E = length(e); % 速率匹配输出数据大小
Ncb = LTE_par.UE_par.Ncb(iTB,iUE);          % 当前码块的软缓冲大小
rvidx = LTE_par.UE_par.rvidx(iTB,iUE);      % 循环冗余版本
nanPosition = LTE_par.UE_par.nanPosition{iTB,iUE}; % 记录w里的NaN位置
turboOutputSize = LTE_par.UE_par.turboOutputSize(iTB,iUE); % Turbo编码输出
interleaverPattern = [0 16 8 24 4 20 12 28 2 18 10 26 6 22 14 30 1 17 9 25 5 21 13 29 3 19 11 27 7 23 15 31]+1;% 子块交织器列变换样式 表5.1.4-1

nPostLeav = rSubTC*cSubTC;      % 交织器大小
w = zeros(1,3*nPostLeav);       % 循环缓冲器

% ======================= 去比特选取 ==============================
% 需要先确定w中的dummy bit
for k = 1:3*nPostLeav
   if nanPosition(k) == 1
       w(k) = NaN;
   end
end

k0 = rSubTC*(2*ceil(Ncb/(8*rSubTC))*rvidx+2); 

j = 0;
for k = 1:E
    while isnan(w(mod(k0+j,Ncb)+1))
        j = j+1;
    end
    loc = mod(k0+j,Ncb)+1;
    if w(loc) == 0
        w(loc) = e(k);
    else
        w(loc) = (w(loc)+e(k))/2;
    end
    j = j+1;
end

% disp('解速率匹配得到的w')
% disp(w)
% ======================= 去子比特收集 ==============================
v = zeros(3,nPostLeav);
v(1,:) = w(1:nPostLeav);            % 系统比特
v(2,:) = w(nPostLeav+1:2:end-1);    % 校验1
v(3,:) = w(nPostLeav+2:2:end);      % 校验2

% ======================= 去子块交织 ================================
iRow = 1;
while iRow < 3
    interleaverMatrix = reshape(v(iRow,:),rSubTC,cSubTC); % 按行优先将v放到一个矩阵中
    interleaverMatrix(:,interleaverPattern) = interleaverMatrix; % 按照交织器列变换样式变换
    interleaverMatrix = transpose(interleaverMatrix); % 转置,使得下一步按列输出时,为原始按行读出
    v(iRow,:) = interleaverMatrix(:); % 按列优先顺序读取
    iRow = iRow+1;
end

alphaPi = zeros(1,nPostLeav);
for k = 1:nPostLeav
    t = floor((k-1)/rSubTC)+1;
   alphaPi(k) = mod(interleaverPattern(t)-1+cSubTC*(mod((k-1),rSubTC))+1,nPostLeav); % RSC2 路数据交织表 
end
alphaPi = alphaPi+1;
v(iRow,alphaPi) = v(iRow,:);

ND = nPostLeav-turboOutputSize; % dummy bit 大小
d = v(:,ND+1:end);

% disp('解速率匹配的alphaPi')
% disp(alphaPi)